package com.taotao.utils;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemortIP {

    private static final String[] PROXY_REMOTE_IP_ADDRESS = {"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "X-Real-IP"};

    private static final Pattern INNER_IP_ADDR_RE = Pattern.compile("(10\\.)|(172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\.)|(192\\.168\\.)");

    /**
     * 是否局域网ip地址
     *
     * @param ip
     * @return true 是，false 否
     */
    public static boolean isInnerIpAddr(String ip) {
        Matcher ipmatcher = INNER_IP_ADDR_RE.matcher(ip);
        return ipmatcher.find();
    }

    /**
     * 获取客户端真实ip
     */
    public static String getClientIP(HttpServletRequest req) {
        String ip = "";
        for (int i = 0; i < PROXY_REMOTE_IP_ADDRESS.length; ++i) {
            ip = req.getHeader(PROXY_REMOTE_IP_ADDRESS[i]);
            if (StringUtils.isEmpty(ip) || ip.equalsIgnoreCase("unknown")) continue;
            ip = getRemoteIpFromForward(ip.trim()).trim();
            if (!isInnerIpAddr(ip)) {
                return ip;
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getRemoteAddr();
        }
        return ip;
    }

    /**
     * <p>
     * 从 HTTP Header 中截取客户端连接 IP 地址。如果经过多次反向代理，
     * 在请求头中获得的是以“,&lt;SP&gt;”分隔 IP 地址链，第一段为客户端 IP 地址。
     * </p>
     *
     * @param xforwardIp 从 HTTP 请求头中获取转发过来的 IP 地址链
     * @return 客户端源 IP 地址
     */
    private static String getRemoteIpFromForward(String xforwardIp) {
        int commaOffset = xforwardIp.indexOf(',');
        if (commaOffset < 0) {
            return xforwardIp;
        }
        return xforwardIp.substring(0, commaOffset);
    }
}
